#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5; // 最大节点数

// 边的结构体，存储u->v的边，权重为w
struct node {
  int u, v, w;
} a[N]; // 存储所有边

// 并查集结构体
struct UnionFind {
  int f[N];

  void init(int n) {
    for (int i = 1; i <= n; i++)
      f[i] = i;
  }

  int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }

  void merge(int x, int y) {
    x = find(x);
    y = find(y);
    if (x != y)
      f[x] = y;
  }
};

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  int n, m; // n个节点，m条边
  cin >> n >> m;
  for (int i = 1; i <= m; ++i)
    cin >> a[i].u >> a[i].v >> a[i].w; // 读入所有边

  int ans = (1 << 30) - 1; // 初始答案，所有30位都设为1
  UnionFind uf;

  // 从高位到低位贪心地尝试将每一位设为0
  for (int i = 29; i >= 0; i--) {
    int t = ans & ~(1 << i); // 尝试将第i位置0

    uf.init(n); // 初始化并查集

    // 遍历所有边，只选择那些权重不包含被清除的位的边
    for (int j = 1; j <= m; j++)
      if ((a[j].w & ~t) == 0)     // 边权重不包含被清除的位
        uf.merge(a[j].u, a[j].v); // 合并集合

    // 检查1和n是否连通
    if (uf.find(1) == uf.find(n)) // 如果连通，则可以清除该位
      ans = t;
  }

  cout << ans << '\n'; // 输出最小可能的位与结果
  return 0;
}